package com.reflex.method;

import org.junit.Test;

import java.awt.*;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Author: lizehui
 * @Description: 练习题：
 * @Date: 2022/11/24/15:12
 */
public class PracticeTest {

    @Test
    /**
     * @Description:
     * 利用反射，获取practice类的私有属性
     * 修改私有属性，并用getName()方法返回
     */
    public void test1() throws Exception{
        //1、获取Practice类
        Class cls = Class.forName("com.reflex.dao.Practice");
        //2、实例化
        Object o = cls.newInstance();
        //3、获取属性对象
        Field field = cls.getDeclaredField("name");
        //4、私有属性爆破
        field.setAccessible(true);
        //5、设置实例的值
        field.set(o,"new 李泽辉");
        //6、获取方法对象
        Method method = cls.getMethod("getName");
        //7、使用实例的getName方法，传入参数
        System.out.println(method.invoke(o));

    }

    @Test
    /**
     * @Description:
     * 用反射得到File类
     * 用控制台打印所有File构造器
     * 通过反射创建 myNew.txt文件
     */
    public void test2() throws Exception{
        //1、获取File类
        Class cls = Class.forName("java.io.File");
        //2、获取所有构造器
        Constructor[] constructors = cls.getDeclaredConstructors();
        //3、遍历输出
        for(Constructor c : constructors){
            System.out.println(c);
        }
        //4、获取指定的构造器，想通过全路径创建文件的那个构造器
        Constructor declaredConstructor = cls.getDeclaredConstructor(String.class);
        String path = "myNew.txt";
        //5、创建File对象
        Object file = declaredConstructor.newInstance(path);
        //6、获取File的创建文件方法
        Method createNewFile = cls.getMethod("createNewFile");
        //7、File对象运行创建文件方法
        createNewFile.invoke(file);

    }

}
